/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package model.funcionario;

import java.util.List;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceException;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
import model.dao.IRepositorioFuncionario;
import model.daoimpl.GenericDAO;
import model.excecoes.ErroDAOException;

/**
 *
 * @author Marcos
 */
public class RepositorioFuncionario extends GenericDAO<Funcionario> implements IRepositorioFuncionario {

    @Override
    public Funcionario logarFuncionario(String login, String senha) throws ErroDAOException, PersistenceException, NoResultException {
        Funcionario funcionario = null;

        try {
            if (login.equals("admin") && senha.equals("admin")) {
                funcionario = new Funcionario();
                funcionario.setFuncao("Administrador");
            } else {
                TypedQuery<Funcionario> query = this.getManager().createQuery("Select new Funcionario(f.funcao) FROM Funcionario f Where f.login = :login and f.senha = :senha", Funcionario.class);
                query.setParameter("login", login);
                query.setParameter("senha", senha);
                if(!query.getResultList().isEmpty()){
                    funcionario = query.getSingleResult();
                }
            }
        } catch (NoResultException ex) {
            throw new ErroDAOException("Erro de Consulta.\nDetalhes Técnicos:\n" + ex.getMessage());
        } catch (PersistenceException ex) {
            throw new ErroDAOException("Erro de Persistência.\nDetalhes Técnicos:\n" + ex.getMessage());
        }

        return funcionario;
    }

    @Override
    public boolean verificarExistencia(String cpf) throws ErroDAOException, PersistenceException, NoResultException {
        boolean verificar = false;

        try {
            String consulta = "Select f From Funcionario f Where f.cpf = :cpf";
            Query query = this.getManager().createQuery(consulta);
            query.setParameter("cpf", cpf);
            if(!query.getResultList().isEmpty()){
                verificar = true;
            }
        } catch (NoResultException ex) {
            throw new ErroDAOException("Erro de Consulta.\nDetalhes Técnicos:\n" + ex.getMessage());
        } catch (PersistenceException ex) {
            throw new ErroDAOException("Erro de Persistência.\nDetalhes Técnicos:\n" + ex.getMessage());
        }

        return verificar;
    }

    @Override
    public List<Funcionario> listarFuncionario(String consulta, String campo) throws ErroDAOException, PersistenceException, NoResultException {
        List<Funcionario> funcionarios = null;
        Query query = null;

        try {
            if (consulta.equals("Todos") && campo.equals("Todos")) {
                query = this.getManager().createQuery("Select f from Funcionario f");
            } else {
                if (campo.equals("Código")) {
                    query = this.getManager().createQuery("Select f From Funcionario f Where f.codigo = :codigo", Funcionario.class);
                    query.setParameter("codigo", Integer.parseInt(consulta));
                } else {
                    if (campo.equals("Nome")) {
                        query = this.getManager().createQuery("Select f From Funcionario f Where f.nome like :nome", Funcionario.class);
                        query.setParameter("nome", "%" + consulta + "%");

                    } else {
                        if (campo.equals("CPF")) {
                            query = this.getManager().createQuery("Select f From Funcionario f Where f.cpf = :cpf", Funcionario.class);
                            query.setParameter("cpf", consulta);
                        }
                    }
                }
            }
        } catch (NoResultException ex) {
            throw new ErroDAOException("Erro de Consulta.\nDetalhes Técnicos:\n" + ex.getMessage());
        } catch (PersistenceException ex) {
            throw new ErroDAOException("Erro de Persistência.\nDetalhes Técnicos:\n" + ex.getMessage());
        }
        funcionarios = query.getResultList();
        return funcionarios;
    }

    @Override
    public void alterar(Funcionario funcionario) throws ErroDAOException, PersistenceException {

        Funcionario f = this.getManager().find(Funcionario.class, funcionario.getCodigo());
        f.setNome(funcionario.getNome());
        f.getEndereco().setRua(funcionario.getEndereco().getRua());
        f.getEndereco().setCidade(funcionario.getEndereco().getCidade());
        f.getEndereco().setBairro(funcionario.getEndereco().getBairro());
        f.getEndereco().setCep(funcionario.getEndereco().getCep());
        f.getEndereco().setComplemento(funcionario.getEndereco().getComplemento());
        f.getEndereco().setUf(funcionario.getEndereco().getUf());
        f.setLogin(funcionario.getLogin());
        f.setSenha(funcionario.getSenha());
        f.setRg(funcionario.getRg());
        f.setCpf(funcionario.getCpf());
        f.setDataNascimento(funcionario.getDataNascimento());
        f.setSalario(funcionario.getSalario());
        f.setFuncao(funcionario.getFuncao());
        f.getContato().setTelefone(funcionario.getContato().getTelefone());
        f.getContato().setCelular(funcionario.getContato().getCelular());
        f.getContato().setEmail(funcionario.getContato().getEmail());
        super.alterar(f);
    }

    @Override
    public void excluir(Funcionario funcionario) throws ErroDAOException, PersistenceException {

        Funcionario f = this.getManager().find(Funcionario.class, funcionario.getCodigo());
        super.excluir(f);
    }
}
